EventBridge SchedulerとBackup APIを利用するLambda関数を用いたrate式でのバックアップを取得する方法

EventBridge SchedulerとBackup APIを利用するLambda関数を用いたrate式でのバックアップを取得する方法

cron式では難しいスケジュールでのバックアップをEventbridge SchedulerとBackup APIを利用したLambda関数で実施します。
Clock Icon2024.11.08

はじめに

かつまたです。
AWS Backupを利用して、カスタマイズしたスケジュールで定期バックアップを実行する際、多くの場合カスタムcron式を用いて設定します。しかし、カスタムcron式では実現が難しいスケジュール設定も時折存在します(月関係なく20日間隔での取得など)。

そこで今回は、EventBridge Schedulerのrate式を使用し、Lambda関数をトリガーとしてBackup APIを呼び出す形でrate式を用いることにより、AWS Backupのみでは実現が簡単でないスケジュールでのバックアップ取得な構成を構築してみました。

構成図は以下の通りです。

BackupRate.drawio.png

前提条件

AWSBackupDefaultServiceRoleの確認

AWS管理ポリシー「AWSBackupServiceRolePolicyForBackup」が適応されているAWSBackupDefaultServiceRoleがアカウント上に存在するか確認します。このロールは一般的にAWSにより自動的に作成されています。

AWSBackupDefaultServiceRoleとは

  • AWS Backupが他のAWSサービスにアクセスするために使用する特別な権限を持つロールです。
  • バックアップ作成や復元などの操作を行う際に必要な権限が含まれています。

AWS BackupのDefaultボールト確認

コンソール上で「Backup」→「ボールト」から「Default」が存在することを確認します。
バックアップボールトは、AWS アカウント内で暗号化されたストレージの場所であり、バックアップ (復旧時点) を保存して整理します。今回はこの「Default」ボールトを使用します。

Lambda用IAMロール作成

Lambda関数へAWS Backupを実行する権限を付与するロールを作成します。
1.コンソールから「IAM」→「ロールを作成」を選択します。
ロールを作成-3.png

2.「信頼されたエンティティタイプ」を「AWSのサービス」、「ユースケース」を「Lambda」とします。ロールを作成します。
Lambdaリソース-2.png

3.ポリシーを作成し、ロールに付与します。先ほど作成したロールを選択し、「許可を追加」→「インラインポリシーを作成」を選択します。
インラインポリシー追加.png

4.JSON形式に変更し、以下ポリシーを記述します。ポリシーを作成します。

ポリシー例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "backup:StartBackupJob",
                "backup:DescribeBackupVault",
                "backup:CreateBackupVault"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateSnapshot",
                "ec2:CreateTags",
                "ec2:DeleteSnapshot",
                "ec2:DescribeSnapshots",
                "ec2:DescribeVolumes"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::アカウントID:role/service-role/AWSBackupDefaultServiceRole"
        }
    ]
}

JSONポリシー追加.png
ポリシー作成.png

Lambda関数作成

1.コンソール上で「Lambda」→「関数」→「関数の作成」を選択します。
関数作成0.png

2.関数名とランタイム(今回Python3.12)を設定します。実行ロールを「既存のロールを使用する」から先ほど作成したLambda用IAMロールを選択します。
Lambda作成.png

3.関数作成後、作成した関数のコードタブからBackup APIを用いる以下ソースコードを記述します。Deployを選択します。

ソースコード例
import boto3
import os
from datetime import datetime
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    backup_client = boto3.client('backup')

    # 環境変数の確認
    logger.info(f"Checking environment variables:")
    logger.info(f"BACKUP_VAULT_NAME: {os.environ.get('BACKUP_VAULT_NAME')}")
    logger.info(f"EBS_VOLUME_ARN: {os.environ.get('EBS_VOLUME_ARN')}")
    logger.info(f"IAM_ROLE_ARN: {os.environ.get('IAM_ROLE_ARN')}")

    try:
        # バックアップボールトの確認
        try:
            backup_client.describe_backup_vault(
                BackupVaultName=os.environ['BACKUP_VAULT_NAME']
            )
            logger.info(f"Backup vault exists: {os.environ['BACKUP_VAULT_NAME']}")
        except Exception as e:
            logger.error(f"Error checking backup vault: {str(e)}")
            raise

        # バックアップの開始
        response = backup_client.start_backup_job(
            BackupVaultName=os.environ['BACKUP_VAULT_NAME'],
            ResourceArn=os.environ['EBS_VOLUME_ARN'],
            IamRoleArn=os.environ['IAM_ROLE_ARN']
        )

        logger.info(f"Backup job started: {response}")
        return {
            'statusCode': 200,
            'body': {
                'message': 'Backup started',
                'backupJobId': response['BackupJobId']
            }
        }

    except Exception as e:
        logger.error(f"Error in backup process: {str(e)}")
        raise

コードソース.png

4.ソースコード内で指定されている環境変数を設定します。Lambda関数の設定タブから「環境変数」を選択します。以下のように環境変数を入力します。

BACKUP_VAULT_NAME    Default
EBS_VOLUME_ARN    arn:aws:ec2:ap-northeast-1:アカウントID:volume/vol-XXXXXXXXXXXXXXXX(EBSのid)
IAM_ROLE_ARN    arn:aws:iam::アカウントID:role/service-role/AWSBackupDefaultServiceRole

環境変数.png

EventBridge Scheduler作成

1.コンソール上で「Eventbridge」→「スケジュール」→「スケジュールを作成」を選択します。
スケジュールを作成.png

2.「スケジュールのパターン」を「定期的なスケジュール」とし、「スケジュールの種類」を「
rate ベースのスケジュール」と選択して、スケジュールを選択します。今回は検証のため3minutesで設定しますが、20daysなどの長期で定期的なスケジュール設定も可能です。
Schedulerをrate設定.png

3.(オプション)バックアップの開始日時を設定したい場合「時間枠」で設定できます。今回の検証では設定していません。

設定例
スケジューラー開始時間設定.png

4.ターゲットの選択で「AWS Lambda」の「Invoke」を選択します。
APIでInvoke指定.png

5.先ほど作成したLambda関数を選択します。
スケジューラーでLambda選択.png

6.スケジュール完了後のアクションを「NONE」に設定します。その他設定はデフォルトとし、EventBridge Schedulerを作成します。
スケジュール完了後のアクション.png

動作確認

EventbridgeによりLambda関数が起動され、バックアップが取得されたことをAWS Backup上で確認します。
1.スケジュールで設定した時間経過後、「Backup」→「ボールト」から「Default」を選択します。
ボールと選択.png

2.復旧ポイントに、Eventbridge Schedulerで設定したスケジュールでスナップショットが取得できていることを確認します。
スナップショット確認.png

おわりに

本記事では、EventBridge SchedulerとLambda関数を活用し、AWS Backupの柔軟なバックアップスケジュール設定方法をご紹介しました。従来のcron式では難しかった特定の間隔でのバックアップ取得を、rate式により簡単に実現できることを紹介しました。

この方法には、以下のような利点があります。

  • 通常のcron式では表現が難しいスケジュールの実現
  • Lambda関数を介することで、バックアップ前後の追加処理の組み込みが可能
  • EventBridge Schedulerの柔軟なスケジュール設定

一方で、以下の点に注意が必要です。

  • Lambda関数およびEventBridge Schedulerの実行による追加コスト
  • 長期運用時のバックアップ世代管理
  • 環境変数や権限設定におけるセキュリティ設定

環境に合わせて、本記事が参考になれば幸いです。ご覧いただきありがとうございました。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.